ZuKitでInfluxDBをUnity Editorと繋いでデータをビジュアライズをする
概要
大量のデータの時系列での変化をグラフにしたかったんだけど面倒くさかったのでinfluxDBに丸投げビジュアライズできるようにした。
ZuKit
これ。
https://github.com/sassembla/ZuKit
influxDBとChronografのセットアップについてはこの辺を参考にする。
「InfluxDB + Chronograf 」をDocker Composeで動かす
https://zutech.netlify.app/posts/20200613/
どういうことがしたかったか
Unity Editor上でフレームごとに出る大量のデータがあり、そのデータのフレーム単位での推移をグラフ化したかった。
データの非可逆な圧縮と展開を行う必要があり、それらの再現度もチェックしたかったので、同時に多量のデータを1つの図に載っけないといけない、という需要があり、とにかく辛かったので作った。
ZuKit側がInfluxDBへとprecision(精度) nsでデータを送りつけている。
今回使うInfluxDBのdocker-composeと起動
こんな感じ。
version: '3.1'
services:
influxdb:
container_name: influxdb
image: influxdb
ports:
- "8086:8086"
volumes:
- influxdb:/var/lib/influxdb
chronograf:
container_name: chronograf
image: chronograf
ports:
- "8888:8888"
links:
- influxdb
volumes:
- chronograf:/var/lib/chronograf
volumes:
influxdb:
chronograf:
んでlocalhost:8888にアクセスするとChronografのUIが表示できるんだけど、localhost~って書いてあるところをindluxdbに書き換えないとchronograf->influxdbへの接続ができない。
これどうやって解決したっけな、、忘れた。
使い方
1. InfluxDBにmyZuDBとか適当な名前でDBを作る
これに
こう。
名前は適当でいいんだけど、Unity側からも指定する必要がある。
2. UnityのStart関数とかにZuKitのSetupコードを書く
こんな感じ
ZuKit.Setup(
"http://localhost:8086",
"myZuDB",
() =>
{
return new ZuValues(
(new ZuKey("key", ("index", 0), ("temp", 1)), Time.frameCount),
(new ZuKey("key", ("index", 1), ("temp", 2)), Random.Range(-100 * Time.frameCount, 100 * Time.frameCount))
);
}
);
一応同時にOnApplicationQuitとかにZuKitの終了メソッドを書いておくと良い
void OnApplicationQuit()
{
ZuKit.Teardown();
}
3. UnityでPlayすると後は勝手にフレーム単位でデータがInfluxDBに届いてビジュアライズできるぞ
こうなる。myZuDBにUnityでセットしたkey、index値、temp(追加した適当なキー)で値が入る。
そのままUnityEditorをPlayさせとくと、こんな感じになる。5sで自動updateとかにするといい感じに推移が
やったぜ!
余談
InfluxDBはデータの送り手側が精度を指定できる。
で、精度指定のためのフォーマットとしてRFC3339とかがあるんだけど、ここで問題が出た。
C#にはUnix Time(https://en.wikipedia.org/wiki/Unix_time)を算出できる関数もRFC3339を取得できる関数もない。 msが欠けた状態のRFC3339を得ることはできるが本当にとても微妙なので、そのへんで無駄な努力を強いられて辛かった。
なんとかTimeとかのバカでっかいライブラリで取得できるっちゃあできるんだが、オーバーヘッドが凄まじい。というか言語がいい仕掛け持っててくれ、、
まあC#のdate系は閏秒すらなかったのがここ最近の話なので、スッと諦めて別の手を試した。
こういうので苦労しないようにRFCをガンガン実装したC++実装作ってUnityからぶっ叩けるようにしようかな~って思ってちょいちょいやってる。